import socket
import binascii  # 导入 binascii 模块

# 构建报文函数
def build_message():
    # 定义字段数据
    length = 256  # 电文长度 固定为256
    tele_no = 'L1DS01'  # 电文号
    allow_homework_top = '1'  # 上表面准许作业
    allow_homework_down = '1'  # 下表面准许作业
    operation_mode = '2'  # 作业模式，假设是自动模式
    tension_top = 123.56  # 上表面建张张力，N类型，6,3 格式
    tension_down = 654.22  # 下表面建张张力，N类型，6,3 格式
    
    # 转换数据为字节
    length_bytes = f"{length}".ljust(4, ' ').encode('ascii')  # 电文长度 4字节
    tele_no_bytes = tele_no.encode('ascii')  # 电文号 6字节
    allow_homework_top_bytes = allow_homework_top.encode('ascii')  # 上表面准许作业 1字节
    allow_homework_down_bytes = allow_homework_down.encode('ascii')  # 下表面准许作业 1字节
    operation_mode_bytes = operation_mode.encode('ascii')  # 作业模式 1字节

    # 将浮动小数转为整数并填充为6个字节
    tension_top_int = int(tension_top * 1000)  # 去掉小数点并转为整数
    tension_down_int = int(tension_down * 1000)  # 去掉小数点并转为整数
    tension_top_bytes = f"{tension_top_int:06d}".encode('ascii')  # 转换为6字节整数
    tension_down_bytes = f"{tension_down_int:06d}".encode('ascii')  # 转换为6字节整数


    # 拼接所有字段为最终报文
    message = (length_bytes + tele_no_bytes + allow_homework_top_bytes + 
               allow_homework_down_bytes + operation_mode_bytes + 
               tension_top_bytes + tension_down_bytes)
    
    # 确保报文长度为 256 字节，不足部分填充空格
    message = message.ljust(256, b' ')

    # 打印报文的十六进制表示
    print(f"Sent (Hex): {binascii.hexlify(message).decode('ascii')}")

    return message

# 发送报文
def send_message():
    # 创建 TCP socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('127.0.0.1', 5001))  # 连接到服务器

    # 构建报文
    message = build_message()

    # 发送报文
    s.sendall(message)
    print(f"Sent: {message}")

    # 接收响应
    data = s.recv(1024)
    print(f"Received: {data.decode('utf-8')}")

    # 关闭连接
    s.close()

# 执行发送
#send_message()

build_message()
